from PIL import Image
import io
import base64
from urllib.parse import quote_plus


# 1. 从 base64 字符串读取图像并压缩到指定大小
def compress_image(base64_str, max_size=(1280, 720), max_bytes=300 * 1024):
    # 移除 base64 字符串中的前缀
    base64_str = remove_base64_prefix(base64_str)
    # 解码 base64 字符串
    img_data = base64.b64decode(base64_str)
    img_byte_arr = io.BytesIO(img_data)
    # 打开图片并压缩
    with Image.open(img_byte_arr) as img:
        # 缩放图片以适应最大尺寸
        img.thumbnail(max_size, Image.Resampling.LANCZOS)
        # 优化图片以减小文件大小
        img_byte_arr = io.BytesIO()
        img.save(img_byte_arr, format="JPEG", optimize=True)
        img_str = img_byte_arr.getvalue()
        if len(img_str) > max_bytes:
            # 如果图片大小超过限制，进一步压缩
            quality = 95
            while len(img_str) > max_bytes and quality > 0:
                quality -= 5
                img_byte_arr = io.BytesIO()
                img.save(img_byte_arr, format="JPEG", quality=quality, resampling=Image.Resampling.LANCZOS)
                img_str = img_byte_arr.getvalue()
        return img_str

# 2. 将压缩后的图片转换成Base64格式
def image_to_base64(img_bytes):
    img_base64 = base64.b64encode(img_bytes).decode('utf-8')
    return f"data:image/jpeg;base64,{img_base64}"


# 处理图片并返回URL编码的Base64字符串
def process_image(base64_image, max_size=(1280, 720), max_bytes=300 * 1024):
    # 读取图片并压缩到指定大小
    compressed_img_bytes = compress_image(base64_image, max_size, max_bytes)
    # 将压缩后的图片转换成Base64格式
    base64_img = image_to_base64(compressed_img_bytes)
    return base64_img

# 检查并移除base64字符串中的前缀
def remove_base64_prefix(base64_str):
    if base64_str.startswith("data:image/"):
        return base64_str.split(",")[1]
    return base64_str

# 使用UrlEncode方法进行UTF-8格式的编码
def url_encode_base64(base64_str):
    encoded_str = quote_plus(base64_str)
    return encoded_str


def compressImgToBase64(img_byte_arr, max_size=(1280, 720), max_bytes=300 * 1024):
    # 打开图片并压缩
    with Image.open(img_byte_arr) as img:
        # 缩放图片以适应最大尺寸
        img.thumbnail(max_size, Image.Resampling.LANCZOS)
        # 优化图片以减小文件大小
        img_byte_arr = io.BytesIO()
        img.save(img_byte_arr, format="JPEG", optimize=True)
        img_str = img_byte_arr.getvalue()
        if len(img_str) > max_bytes:
            # 如果图片大小超过限制，进一步压缩
            quality = 95
            while len(img_str) > max_bytes and quality > 0:
                quality -= 5
                img_byte_arr = io.BytesIO()
                img.save(img_byte_arr, format="JPEG", quality=quality, resampling=Image.Resampling.LANCZOS)
                img_str = img_byte_arr.getvalue()
        return base64.b64encode(img_str).decode('utf-8')
    
# print(process_image())
